#include <iostream>

// 使用作用域枚举
enum class Status { Unknow, Created, Connected };
Status s = Status::Unknow;

int main(int argc, char *argv[]) {
  std::cout << "==== ch01 p06 ====" << std::endl;

  // 使用 using 在局部作用域内引入枚举标识符
  using Status::Unknow;
  Status s = Unknow;

  return 0;
}

// 使用 using enum 在局部作用域内引入枚举的全部标识符
struct Foo {
  enum class Status { Unknow, Created, Connected };
  using enum Status;
};

Foo::Status s1 = Foo::Unknow; // instead of Foo::Status::Unknow

// switch 语句中使用 using enum 引入枚举的全部标识符
void process(Status const s) {
  switch (s) {
    using enum Status;
  case Unknow: /* ... */
    break;
  case Created: /* ... */
    break;
  case Connected: /* ... */
    break;
  default: /* ... */
    break;
  }
}

// 支持指定基础类型; 可以用显式类型转换将类型转为基础类型
enum class Codes : unsigned int { Ok = 0, Error = 1, Invalid = 2 };

auto c1 = Codes::Ok; // 正确 c1 类型为 Codes
// unsigned int c2 = Codes::Error; // 错误
auto c3 = static_cast<unsigned int>(Codes::Error); // 正确 c3 类型 unsigned int
